/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package pe.com.cotelasa.scp.controlador;

import java.io.Serializable;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import javax.faces.event.ActionEvent;
import javax.inject.Inject;
import javax.inject.Named;
import org.apache.log4j.Logger;
import org.primefaces.event.DateSelectEvent;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import pe.com.cotelasa.common.controlador.MBGenerico;
import pe.com.cotelasa.scp.common.IObserver;
import pe.com.cotelasa.scp.controlador.backingBean.BKBoletaCompra;
import pe.com.cotelasa.scp.controlador.comando.ComandoGuardar;
import pe.com.cotelasa.scp.dominio.common.Constantes;
import pe.com.cotelasa.scp.dominio.common.ESTADO_REGISTRO;
import pe.com.cotelasa.scp.dominio.common.TIPO_DOC_COMPRA;
import pe.com.cotelasa.scp.dominio.common.URLPaginacion;
import pe.com.cotelasa.scp.dominio.common.util.UtilitarioCadenas;
import pe.com.cotelasa.scp.dominio.common.util.UtilitarioFecha;
import pe.com.cotelasa.scp.dominio.excepcion.ServiceException;
import pe.com.cotelasa.scp.dominio.service.IServicioCompraFacturacion;
import pe.com.cotelasa.scp.dominio.service.IServicioOrdenCompraServicio;
import pe.com.cotelasa.scp.dominio.service.IServicioOrdenPedido;
import pe.com.cotelasa.scp.dominio.service.IServicioParametro;
import pe.com.cotelasa.scp.dominio.service.IServicioProveedor;
import pe.com.cotelasa.scp.dominio.service.IServicioProveedorArticulo;
import pe.com.cotelasa.scp.dominio.service.IServicioTipoCambio;
import pe.com.cotelasa.scp.dominio.service.IServicioTipoFormaPago;
import pe.com.cotelasa.scp.dominio.service.IServicioTipoMoneda;
import pe.com.cotelasa.scp.dominio.service.IServicioTipoUnidadMinima;
import pe.com.cotelasa.scp.entidad.Articulo;
import pe.com.cotelasa.scp.entidad.CompraFacturacion;
import pe.com.cotelasa.scp.entidad.DetalleCompraFacturacion;
import pe.com.cotelasa.scp.entidad.DetalleOrdenCompraServicio;
import pe.com.cotelasa.scp.entidad.OrdenCompraServicio;
import pe.com.cotelasa.scp.entidad.OrdenPedido;
import pe.com.cotelasa.scp.entidad.ParametroDetalle;
import pe.com.cotelasa.scp.entidad.Proveedor;
import pe.com.cotelasa.scp.entidad.TipoCambio;
import pe.com.cotelasa.scp.entidad.TipoMoneda;
import pe.com.cotelasa.seguridad.controlador.backingBean.BKSession;

/**
 *
 * @author WINDOWS 7
 */
@Named(value = "MBBoletaCompra")
@Scope("request")
public class MBBoletaCompra extends MBGenerico implements IMantenedor, IObserver, Serializable {

    private static final long serialVersionUID = -8665913600449084832L;
    private static Logger logger = Logger.getLogger(MBBoletaCompra.class);
    @Inject
    private BKBoletaCompra bk;
    @Inject
    private IServicioCompraFacturacion servicioCompraFacturacion;
    @Inject
    private IServicioOrdenPedido servicioOrdenPedido;
    @Inject
    private IServicioOrdenCompraServicio servicioOrdenCS;
    @Inject
    private IServicioTipoMoneda servicioTipoMoneda;
    @Inject
    private IServicioTipoUnidadMinima servicioUnidadMedida;
    @Inject
    private IServicioParametro servicioParametro;
    @Inject
    private IServicioTipoFormaPago servicioFormaPago;
    @Inject
    private MBDetalleBC mbDetalleBC;
    @Inject
    private IServicioTipoCambio servicioTipoCambio;
    @Autowired
    BKSession session;

    public MBBoletaCompra() {
    }

    public void buscarListaBoletas() {
        try {
            if (bk.getBoletaBusqueda().getIdOrdenPedido() == null) {
                bk.getBoletaBusqueda().setIdOrdenPedido(new OrdenPedido());
            }
            bk.getBoletaBusqueda().setIdEmpresa(session.getEmpresa());
            bk.getBoletaBusqueda().getIdOrdenPedido().setIdEmpresa(session.getEmpresa());
            bk.setListaBoletasBusqueda(servicioCompraFacturacion.buscarCompraFacturacionPorFiltro(bk.getBoletaBusqueda(), bk.getFechaInicio(), bk.getFechaFinal()));
        } catch (ServiceException e) {
            mostrarError("Ocurrieron algunos problemas al cargar la informacion. Vuelva a intentar.");
            logger.error(e.getMessage(), e);
        }
    }

    public String mostrarMantenimiento() {
        try {

            bk.setBoletaBusqueda(new CompraFacturacion());
            bk.getBoletaBusqueda().setNumeroFactura("");
            OrdenPedido ordenP = new OrdenPedido();
            ordenP.setIdEmpresa(session.getEmpresa());
            bk.getBoletaBusqueda().setTipoCompPago(TIPO_DOC_COMPRA.BOLETA.getValor());
            bk.setListaOrdenesPedidoBusqueda(servicioOrdenPedido.listarOrdenesPedidoActivosPorEmpresa(ordenP));
            bk.getBoletaBusqueda().setIdOrdenPedido(new OrdenPedido(-1));
            bk.getBoletaBusqueda().setIdOrdenCompraServicio(new OrdenCompraServicio(-1));
            bk.getBoletaBusqueda().setIdProveedor(new Proveedor());
            bk.getBoletaBusqueda().getIdProveedor().setRazonSocial("");
            bk.getBoletaBusqueda().setEstadoCancelacion('P');
            bk.setListaBoletasBusqueda(null);

        } catch (ServiceException e) {
            // TODO Auto-generated catch block
            logger.error((e == null) ? "NullPointerException" : e.getCause());
            e.printStackTrace();
        }

        return URLPaginacion.BoletaCompra.URL_LISTA_BOLETA_COMPRA;
    }

    @Override
    public String nuevo() {
        this.bk.setComando(new ComandoGuardar(this));
        mbDetalleBC.addObserver(this);

        bk.setBoletaFormulario(new CompraFacturacion());
        bk.getBoletaFormulario().setIdEmpresa(session.getEmpresa());
        bk.getBoletaFormulario().setIdProveedor(new Proveedor());
        bk.getBoletaFormulario().setIdTipoMoneda(new TipoMoneda());
        bk.getBoletaFormulario().setTipoCompPago(TIPO_DOC_COMPRA.BOLETA.getValor());
        bk.getBoletaFormulario().setIdOrdenPedido(new OrdenPedido(0));
        bk.getBoletaFormulario().setIdOrdenCompraServicio(new OrdenCompraServicio(0));
        bk.getBoletaFormulario().setEstadoCancelacion('P');
        bk.getBoletaFormulario().setDiasPago(0);
        bk.getBoletaFormulario().setDetalleFacturaCollection(new ArrayList<DetalleCompraFacturacion>());
        cargarCombo();



        return URLPaginacion.BoletaCompra.URL_FORMULARIO_BOLETA_COMPRA;
    }

    @Override
    public String guardar() {
        try {
            bk.getBoletaFormulario().setFecCreacion(new Date());
            bk.getBoletaFormulario().setUsrCreacion(session.getUsuario().getUsuario());
            bk.getBoletaFormulario().setTipoFactura(bk.getBoletaFormulario().getIdOrdenCompraServicio().getTipo());

            bk.getBoletaFormulario().setSerie(UtilitarioCadenas.formatoSerieDocumento(Integer.parseInt(bk.getBoletaFormulario().getSerie())));
            bk.getBoletaFormulario().setNumeroFactura(UtilitarioCadenas.formatoNumeroDocumento(Integer.parseInt(bk.getBoletaFormulario().getNumeroFactura())));

            servicioCompraFacturacion.guardarCompraFacturacion(bk.getBoletaFormulario());

            buscarListaBoletas();
            mostrarMensaje("Se guardo la factura satisfactoriamente.");
        } catch (ServiceException e) {
            e.printStackTrace();
            mostrarError("Ocurrieron algunos problemas al guardar la informacion. Vuelva a intentar.");
            logger.error(e.getMessage(), e);
        }
        return URLPaginacion.BoletaCompra.URL_LISTA_BOLETA_COMPRA;
    }

    @Override
    public String editar() {
        return "";
    }

    @Override
    public String actualizar() {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    private void cargarCombo() {
        OrdenPedido ordenp = new OrdenPedido();
        ordenp.setEstadoPedido("E");
        ordenp.setIdEmpresa(session.getEmpresa());

        OrdenCompraServicio orden = new OrdenCompraServicio();
        orden.setIdOrdenPedido(bk.getBoletaFormulario().getIdOrdenPedido());
        orden.setTipo('%');
        String[] listaEsdado = {"" + OrdenCompraServicio.ESTADO_ORDEN_SC.ANULADO.getValor(),
            "" + OrdenCompraServicio.ESTADO_ORDEN_SC.BORRADOR.getValor()};

        try {
            bk.getBoletaFormulario().setFormaPago(servicioFormaPago.conseguirTipoFormaPagoPorNombre(Constantes.FormaPago.CONTADO));

            bk.setListaTipoPago(new ArrayList<String>());
            for (ParametroDetalle param : servicioParametro.listarTipoPago(bk.getBoletaFormulario().getFormaPago().getNombre())) {
                bk.getListaTipoPago().add(param.getValCadena());
            }

            bk.setListaTipoMoneda(servicioTipoMoneda.listarTipoMonedasActivos());
            //bk.setListaProveedor(servicioProveedorArticulo.listarProveedoresDistintos());

            bk.setListaOrdenesCSFormulario(servicioOrdenCS.listarOrdenCSConCodigoPorOP(orden, listaEsdado));
            bk.setListaOrdenesPedidoFormulario(servicioOrdenPedido.listarOrdenesPedidoPorEstado(ordenp));

            bk.setListaUnidadMedida(servicioUnidadMedida.listarTipoUnidadMinimasActivos());

        } catch (ServiceException e) {
            logger.error(e.getMessage(), e);
            mostrarError("Ocurrio un error al cargar la informacion.");
        }
    }

    public void listarOrdenCS() {
        try {
            System.out.println("orden de pedido1: " + bk.getBoletaFormulario().getIdOrdenPedido().getId());
            if (bk.getBoletaFormulario().getIdOrdenPedido().getId() != 0) {
                bk.getBoletaFormulario().setIdOrdenPedido(servicioOrdenPedido.conseguirOrdenPedidoPorId(bk.getBoletaFormulario().getIdOrdenPedido().getId()));
                System.out.println("orden de pedido: " + bk.getBoletaFormulario().getIdOrdenPedido());
            }


            bk.getBoletaFormulario().setIdOrdenCompraServicio(new OrdenCompraServicio(0));

            OrdenCompraServicio orden = new OrdenCompraServicio();
            orden.setIdOrdenPedido(bk.getBoletaFormulario().getIdOrdenPedido());
            orden.setTipo('C');
            String[] listaEsdado = {"" + OrdenCompraServicio.ESTADO_ORDEN_SC.ANULADO.getValor(),
                "" + OrdenCompraServicio.ESTADO_ORDEN_SC.BORRADOR.getValor()};
            orden.setFormaPago(servicioFormaPago.conseguirTipoFormaPagoPorNombre(Constantes.FormaPago.CONTADO));
            bk.setListaOrdenesCSFormulario(servicioOrdenCS.listarOrdenCSConCodigoPorOP(orden, listaEsdado));
            bk.getBoletaFormulario().getDetalleFacturaCollection().clear();
        } catch (ServiceException e) {
            mostrarError("Ocurrieron algunos problemas al guardar la informacion. Vuelva a intentar.");
            logger.error(e.getMessage(), e);
        }

    }

    public void listarOrdenCSBusqueda() {
        OrdenCompraServicio orden = new OrdenCompraServicio();
        if (bk.getBoletaBusqueda().getIdOrdenPedido().getId() == -1) {

            bk.setListaOrdenesCSBusqueda(null);
            orden.setId(-1);
            bk.getBoletaBusqueda().setIdOrdenCompraServicio(orden);

        } else {

            orden.setIdOrdenPedido(bk.getBoletaBusqueda().getIdOrdenPedido());
            orden.setEstadoOrden("" + OrdenCompraServicio.ESTADO_ORDEN_SC.BORRADOR.getValor());
            orden.setTipo('C');
            String[] listaEsdado = {"" + OrdenCompraServicio.ESTADO_ORDEN_SC.ANULADO.getValor(),
                "" + OrdenCompraServicio.ESTADO_ORDEN_SC.BORRADOR.getValor()};
            try {
                orden.setFormaPago(servicioFormaPago.conseguirTipoFormaPagoPorNombre(Constantes.FormaPago.CONTADO));

                bk.setListaOrdenesCSBusqueda(servicioOrdenCS.listarOrdenCSConCodigoPorOP(orden, listaEsdado));
            } catch (ServiceException e) {
                mostrarError("Ocurrieron algunos problemas al guardar la informacion. Vuelva a intentar.");
                logger.error(e.getMessage(), e);
            }

        }

    }

    public void elegirOCS() {
        try {
            if (bk.getBoletaFormulario().getIdOrdenCompraServicio().getId() != 0) {

                bk.getBoletaFormulario().setIdOrdenCompraServicio(servicioOrdenCS.conseguirOrdenCompraServicioPorId(bk.getBoletaFormulario().getIdOrdenCompraServicio().getId()));

                bk.getBoletaFormulario().setIdProveedor(bk.getBoletaFormulario().getIdOrdenCompraServicio().getIdProveedor());
                bk.getBoletaFormulario().setIdTipoMoneda(bk.getBoletaFormulario().getIdOrdenCompraServicio().getIdTipoMoneda());

                //bk.getBoletaFormulario().setFormaPago(bk.getBoletaFormulario().getIdOrdenCompraServicio().getFormaPago());
                bk.getBoletaFormulario().setTipoPago(bk.getBoletaFormulario().getIdOrdenCompraServicio().getTipoPago());
                bk.getBoletaFormulario().getDetalleFacturaCollection().clear();
                bk.getListaArticuloDetalle().clear();
                for (DetalleOrdenCompraServicio det : bk.getBoletaFormulario().getIdOrdenCompraServicio().getDetalleOrdenCompraServicioCollection()) {
                    if (det.getEstadoRegistro() == ESTADO_REGISTRO.ACTIVO.getValor()) {
                        bk.getListaArticuloDetalle().add(det.getIdArticulo());
                    }

                }
                System.out.println("lista de art: " + bk.getListaArticuloDetalle());
            }

        } catch (ServiceException e) {
            mostrarError("Ocurrieron algunos problemas al guardar la informacion. Vuelva a intentar.");
            logger.error(e.getMessage(), e);
        }
    }

    public void calcularTotales(Collection<DetalleCompraFacturacion> lista) {
        BigDecimal subTotal = BigDecimal.ZERO;
        try {

            for (DetalleCompraFacturacion detalle : lista) {
                subTotal = subTotal.add(detalle.getPrecioTotal());
            }

            bk.getBoletaFormulario().setSubTotal(subTotal);
            bk.getBoletaFormulario().setTotal(subTotal);

        } catch (Exception e) {
            mostrarError("Ocurrieron algunos problemas al guardar la informacion. Vuelva a intentar.");
            logger.error(e.getMessage(), e);
        }


    }

    public void eliminarDetalle() {
        if (bk.getDetalleBoletaSeleccionada().getId() == null) {

            Iterator itr = bk.getBoletaFormulario().getDetalleFacturaCollection().iterator();
            while (itr.hasNext()) {
                DetalleCompraFacturacion det = (DetalleCompraFacturacion) itr.next();
                System.out.println("articulo 1: " + bk.getDetalleBoletaSeleccionada().getIdArticulo());
                System.out.println("articulo 2: " + det.getIdArticulo());
                if (bk.getDetalleBoletaSeleccionada().getIdArticulo().getId().equals(det.getIdArticulo().getId())) {
                    itr.remove();
                    break;
                }
            }

        } else {

            Integer index = ((List<DetalleCompraFacturacion>) this.bk.getBoletaFormulario().getDetalleFacturaCollection()).indexOf(bk.getDetalleBoletaSeleccionada());
            bk.getDetalleBoletaSeleccionada().setEstadoRegistro(ESTADO_REGISTRO.INACTIVO.getValor());
            bk.getDetalleBoletaSeleccionada().setFecModificacion(new Date());
            bk.getDetalleBoletaSeleccionada().setUsrModificacion(session.getUsuario().getUsuario());
            ((List<DetalleCompraFacturacion>) this.bk.getBoletaFormulario().getDetalleFacturaCollection()).set(index, bk.getDetalleBoletaSeleccionada());

        }
        calcularTotales(bk.getBoletaFormulario().getDetalleFacturaCollection());
    }

    @Override
    public void eliminar(ActionEvent actionEvent) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public String ver() {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public String aceptar() {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public String retroceder() {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public String cancelar() {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public void actualizarObservador(Object object) {
        DetalleCompraFacturacion detalle = (DetalleCompraFacturacion) object;
        System.out.println("entrooo " + detalle.getIdArticulo().getNombreComercial());
        detalle.setIdFactura(bk.getBoletaFormulario());
        for (Articulo art : bk.getListaArticuloDetalle()) {
            if (art.getId().equals(detalle.getIdArticulo().getId())) {
                detalle.setIdArticulo(art);
            }
        }
        try {
            detalle.setUnidadMedida(servicioUnidadMedida.conseguirTipoUnidadMinimaPorId(detalle.getUnidadMedida().getId()));
        } catch (ServiceException e) {
            logger.error(e.getMessage(), e);
        }
        bk.getBoletaFormulario().getDetalleFacturaCollection().add(detalle);
        calcularTotales(bk.getBoletaFormulario().getDetalleFacturaCollection());
        System.out.println("detalles: " + bk.getBoletaFormulario().getDetalleFacturaCollection());
    }

    public boolean isRenderedColumn(String estado) {
        return estado.equalsIgnoreCase("" + ESTADO_REGISTRO.ACTIVO.getValor()) || estado.equalsIgnoreCase("");
    }

    public void marcarFecha(DateSelectEvent event) {

        TipoCambio tipo = new TipoCambio();
        tipo.setFecCreacion(event.getDate());
        try {

            tipo = servicioTipoCambio.ValidarTipoCambio(tipo);

            if (tipo == null) {

                bk.getBoletaFormulario().setFecEmision(null);
                bk.getBoletaFormulario().setTipoCambio(null);
                mostrarError("No se ha registrado tipo de cambio para el " + UtilitarioFecha.formatearFecha(event.getDate(), "d/M/Y"));
            } else {
                bk.getBoletaFormulario().setTipoCambio(tipo.getVenta());
            }

        } catch (ServiceException e) {
            logger.error(e.getMessage(), e);
            mostrarError("Ocurrio un error al cargar la informacion.");
        }
    }
}
